package net.qujoy.java8.methodparam.first;

import net.qujoy.java8.domain.Apple;

import java.util.ArrayList;
import java.util.List;

/**
 * 苹果条件工具类
 */
public class AppleUtil {

    /**
     * 过滤绿色的苹果
     *
     * @param apples 需要过滤的参数
     * @return 绿色苹果集合
     */
    public static List<Apple> filterGreenApple(List<Apple> apples) {
        List<Apple> result = new ArrayList<Apple>();
        for (Apple apple : apples) {
            if ("green".equals(apple.getColor())) {
                result.add(apple);
            }
        }
        return result;
    }

    //出现问题是如果需要过滤其他颜色的苹果，这会复制这段代码，或者传参
    //一个良好的原则是在编写类似的代码之后，尝试将其抽象化。

    //一种做法是给方法加一个参数，把颜色变成参数，这样就能灵活地适应变化了：
    public static List<Apple> filterApplesByColor(List<Apple> inventory,
                                                  String color) {
        List<Apple> result = new ArrayList<Apple>();
        for (Apple apple : inventory) {
            if (apple.getColor().equals(color)) {
                result.add(apple);
            }
        }
        return result;
    }

    //现在，只要像下面这样调用方法，农民朋友就会满意了：
    //List<Apple> greenApples = filterApplesByColor(inventory, "green");
    //List<Apple> redApples = filterApplesByColor(inventory, "red");

    /*要是能区分
    轻的苹果和重的苹果就太好了。重的苹果一般是重量大于150克。”
    作为软件工程师，你早就想到农民可能会要改变重量，于是你写了下面的方法，用另一个参
    数来应对不同的重量：*/
    public static List<Apple> filterApplesByWeight(List<Apple> inventory,
                                                   int weight) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > weight) {
                result.add(apple);
            }
        }
        return result;
    }

    //如果进行多条件查询，比如绿色且大于500g的苹果，则可以封装成一个filter,加入过滤标识
    //public static List<Apple> filter(list,color,weight,flag)
    //这样做如果加入其他条件，比如形状产地等都会加深过滤深度

    //引入行为参数化

}
